#include <stdio.h>
#include <sys/msg.h>
#include <errno.h>

typedef struct msmg
{
    long type;
    int num;
    char ch;
}msmg,*fmsmg;

void initialize(fmsmg msg,int type,int num,char ch){

    (*msg).type = type;//类型
    (*msg).num = num;
    (*msg).ch = ch;

    return;
}


int main(int argc,const char* argv){

    //key
    key_t key = ftok("./app",'a');
    if(key < 0){
        perror("ftok err");
        return -1;
    }
    printf("key:%#x\n",key);



    int msgid = msgget(key,IPC_CREAT | IPC_EXCL | 0666);
    if(msgid <= 0){
        if(errno == EEXIST){
            msgid = msgget(key,0666);
        }else{
            perror("msgget err");
            return -1;
        }
    }

    printf("shmid:%d\n",msgid);

    //添加消息
    msmg msg;
    msg.type = 10;//类型
    msg.num = 100;
    msg.ch = 'a';
    ssize_t size = sizeof(msg) - sizeof(long);
    msgsnd(msgid,&msg,size,0);

    initialize(&msg,20,200,'b');
    msgsnd(msgid,&msg,size,0);


    msmg my;

    msgrcv(msgid,&my,size,10,0);
    printf("%d %c\n",my.num,my.ch);

    msgctl(msgid,IPC_RMID,NULL);




    return 0;
}